package kryptoBlatt2;

public class Main {

	public static void main(String[] args) {
		int[] state = {0,1,0,0};
		//LSR Aufgabe a
		LSR lsrA = new LSR(state, new Function(new int[]{0, 1, 0, 1}));
		//LSR Aufgabe b
		LSR lsrB = new LSR(state, new Function(new int[]{0, 1, 1, 1}));
		//LSR Aufgabe c
		LSR lsrC = new LSR(state, new Function(new int[]{1, 1, 0, 1}));
		//LSR Aufgabe d
		LSR lsrD = new LSR(state, new Function(new int[]{1, 1, 1, 1}));
		System.out.println("1a)");
		System.out.println("Periodenlaenge: " + lsrA.getPeriode());
		System.out.println(lsrA.checkBeginValues() + "\n");
		System.out.println("1b)");
		System.out.println("Periode: " + lsrB.getPeriode());
		System.out.println(lsrB.checkBeginValues() + "\n");
		System.out.println("1c)");
		System.out.println("Periode: " + lsrC.getPeriode());
		System.out.println(lsrC.checkBeginValues() + "\n");
		System.out.println("1d)");
		System.out.println("Periode: " + lsrD.getPeriode());
		System.out.println(lsrD.checkBeginValues() + "\n");
		System.out.println("Aufgabe 4:");
		//leeres LSR anlegen
		LSR emptyLSR = new LSR();
		//funktion bestimmen und Startzustand einfuegen
		emptyLSR.getLSR("0100010010");
		System.out.println("Startzustand des ermittelten LSR's:");
		emptyLSR.printBeginState();
		System.out.println("\nKoeffizienten des ermittelten LSR's:");
		emptyLSR.printFunctionCoeffs();
		System.out.println("62 Glieder (doppelte Periodenlaenge) des Outputs des ermittelten LSR's:");
		emptyLSR.shift(62);
		emptyLSR.printOutputHistory();
		//Startzustaende fuer die 3 LSR's des stop and go generators (a_0, ..., a_n-1)
		int[] state1 = {1, 1, 0, 1};
		int[] state2 = {1, 0, 1};
		int[] state3 = {0, 1, 0, 1, 1};
		LSR lsr1 = new LSR(state1, new Function(new int[]{1, 0, 1, 1}));
		LSR lsr2 = new LSR(state2, new Function(new int[]{1, 0, 1}));
		LSR lsr3 = new LSR(state3, new Function(new int[]{1, 0, 1, 1, 1}));
		System.out.println("Aufgabe 5:\n");
		//stop and go generator erstellen
		StopAndGoGeneratorVar1 sagg = new StopAndGoGeneratorVar1(lsr1, lsr2, lsr3);
		//20 Takte ablaufen lassen
		sagg.step(20);
		System.out.println("Aktuelle Ausgabe nach 20 Schritten des Stop and go generators:");
		sagg.printCurrentOutput();
		System.out.println("\nOutput history nach 20 Schritten des Stop and go generators:");
		sagg.printOutputHistory();
		/*
		sagg.resetSAGG(); //notwendig, da sonst bereits 20 Schritte gegangen wurden und der Zustand nach 5 Schritten nicht mehr erreicht werden kann
		sagg.step(5);
		System.out.println("\nOutput history nach 5 Schritten des Stop and go generators:");
		sagg.printOutputHistory();
		*/
		System.out.println("\nPeriode des Stop and go generators: ");
		System.out.println(sagg.calcPeriode());
	}
	
}
